/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Soligee.model.vo.lancamentos;

import Soligee.model.vo.cadastros.PessoaVO;
import Soligee.model.vo.cadastros.ProdutoVO;
import Soligee.model.vo.cadastros.ParcelaVendaVO;
import javax.persistence.*;
import java.util.Collection;
import java.util.Date;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import Soligee.model.vo.cadastros.VendedorVO;
import java.io.Serializable;

@Entity
@Table(name="venda")
public class VendaVO implements Serializable {


    @Id
    @SequenceGenerator( name = "cod_venda", sequenceName = "cod_venda_seq",allocationSize = 1 )
    @GeneratedValue( strategy = GenerationType.SEQUENCE, generator="cod_venda")
    @Column(name="cod_venda", nullable = false)
    private int codVenda;
    @Column(name = "dataVenda", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date dataVenda;
    @Column(name = "desconto", nullable = false)
    private double desconto;
    @Column(name = "acrescimo", nullable = false)
    private double acrescimo;
    @Column(name = "qtadeParcela", nullable = false)
    private int quantidadeParcela;
    @Column(name = "totalitens", nullable = false)
    private double totalItens;
    @Column(name = "totalvenda", nullable = false)
    private double totalVendas;
    @Column (name="ativo", nullable = false)
    private boolean ativo;

    @OneToMany(mappedBy = "venda", fetch = FetchType.LAZY)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Collection<ParcelaVendaVO> parcelas;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="cod_forma_pagamento", insertable=true, updatable=true, nullable = false)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private FormaPagamentoVO formaPagamento;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="cod_pessoa", insertable=true, updatable=true, nullable = false)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private PessoaVO pessoa;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="cod_vendedor", insertable=true, updatable=true, nullable = false)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private VendedorVO vendedor;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "itens_venda",
    joinColumns = {@JoinColumn(name = "cod_venda")},
    inverseJoinColumns = {@JoinColumn(name = "cod_produto")})
    @Cascade(CascadeType.SAVE_UPDATE)
    private Collection<ProdutoVO> produtos;

    public VendaVO() {
    }

    public VendaVO(int codVenda, Date dataVenda, double desconto, double acrescimo, int quantidadeParcela, double totalItens, double totalVendas,
            FormaPagamentoVO formaPagamento, PessoaVO pessoa, VendedorVO vendedor) {
        this.codVenda = codVenda;
        this.dataVenda = dataVenda;
        this.desconto = desconto;
        this.acrescimo = acrescimo;
        this.quantidadeParcela = quantidadeParcela;
        this.totalItens = totalItens;
        this.totalVendas = totalVendas;
        this.ativo = true;
        this.formaPagamento = formaPagamento;
        this.pessoa = pessoa;
        this.vendedor = vendedor;
    }

    public double getAcrescimo() {
        return acrescimo;
    }

    public void setAcrescimo(double acrescimo) {
        this.acrescimo = acrescimo;
    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public int getCodVenda() {
        return codVenda;
    }

    public void setCodVenda(int codVenda) {
        this.codVenda = codVenda;
    }

    public Date getDataVenda() {
        return dataVenda;
    }

    public void setDataVenda(Date dataVenda) {
        this.dataVenda = dataVenda;
    }

    public double getDesconto() {
        return desconto;
    }

    public void setDesconto(double desconto) {
        this.desconto = desconto;
    }

    public FormaPagamentoVO getFormaPagamento() {
        return formaPagamento;
    }

    public void setFormaPagamento(FormaPagamentoVO formaPagamento) {
        this.formaPagamento = formaPagamento;
    }

    public PessoaVO getPessoa() {
        return pessoa;
    }

    public void setPessoa(PessoaVO pessoa) {
        this.pessoa = pessoa;
    }

    public int getQuantidadeParcela() {
        return quantidadeParcela;
    }

    public void setQuantidadeParcela(int quantidadeParcela) {
        this.quantidadeParcela = quantidadeParcela;
    }

    public double getTotalItens() {
        return totalItens;
    }

    public void setTotalItens(double totalItens) {
        this.totalItens = totalItens;
    }

    public double getTotalVendas() {
        return totalVendas;
    }

    public void setTotalVendas(double totalVendas) {
        this.totalVendas = totalVendas;
    }

    public VendedorVO getVendedor() {
        return vendedor;
    }

    public void setVendedor(VendedorVO vendedor) {
        this.vendedor = vendedor;
    }

    public Collection<ProdutoVO> getProdutos() {
        return produtos;
    }

    public void setProdutos(Collection<ProdutoVO> produtos) {
        this.produtos = produtos;
    }

    public Collection<ParcelaVendaVO> getParcelas() {
    return parcelas;
    }

    public void setParcelas(Collection<ParcelaVendaVO> parcelas) {
    this.parcelas = parcelas;
    }
}
